Use case: UART RX in interrupt mode

Sequence diagram

UART receive in interrupt mode

@startuml
participant " Application" as p1
participant "HAL UART driver" as p2
participant "UARTX_IRQHandler" as p3

== initialization and configuration ==
== UART HAL Receive IT ==

p1->p2: <color: green> HAL_UART_Receive_IT(huart, aRxBuffer, DATA_TO_RECEIVE_SIZE)
note over p2 #00FF00
Receiving data ongoing
end note
p2-->p1: HAL_OK
p3<-: UARTX data interrupt
p3->p2: HAL_UART_IRQHandler
note over p2 #FFFF99
All data (Size == huart->RxXferCount) have been received
end note
note over p2 #00FF00
End of receiving data
end note
p2->p1: HAL_UART_RxCpltCallback(huart->RxXferCount)

@enduml

Code snippet

HAL1

HAL2

 #define DATA_TO_RECEIVE_SIZE       256

 uint8_t aRxBuffer[DATA_TO_RECEIVE_SIZE];

 UART_HandleTypeDef huart;


 /* Ensure that all required peripherals
   (USART, GPIO,NVIC etc.) are configured properly
 /*
 ...
 */

 /* UART register Receive complete user callback */
 HAL_UART_RegisterCallback(&huart, HAL_UART_RX_CB_ID,
                           UART_RxCpltCallback);

 /* Start a UART Process in interruption mode */
HAL_UART_Receive_IT(&huart, aRxBuffer,
                         DATA_TO_RECEIVE_SIZE)
#define DATA_TO_RECEIVE_SIZE       256

uint8_t aRxBuffer[DATA_TO_RECEIVE_SIZE];

hal_uart_handle_t huart;


/* Ensure that all required peripherals
  (USART, GPIO,NVIC etc.) are configured properly
/*
...
*/

/* UART register Receive complete user callback */
HAL_UART_RegisterRxCpltCallback(&huart, UART_RxCpltCallback);


/* Start a UART Process in interruption mode */
HAL_UART_Receive_IT(&huart, aRxBuffer,
                        DATA_TO_RECEIVE_SIZE)

Key changes

  1. HAL2 provides a dedicated registration API for RX completion callbacks: HAL_UART_RegisterRxCpltCallback().

  2. HAL2 RX completion callback includes an RX event argument (for example HAL_UART_RXEVENT_TC).